




/*

导航栏 navigationItem 显示什么内容不是看导航控制器,看导航控制器当前正在显示的子控制器    !!!!!!!

*/


import UIKit
import SVProgressHUD
import SVPullToRefresh


class JYHomeTableViewController: JYBaseTableViewController {
    //懒加载刷新View
    private lazy var pullDownRefreshController: JYPullDownRefreshController = JYPullDownRefreshController()
    private let ReuseIdentifier = "ReuseIdentifier"
    /// 微博模型
    var statuses: [JYStatus]? {
        didSet {
            //切记!
            self.tableView.reloadData()
        }
    }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        if !JYUserAccountViewModel.sharaInstance.userlogin {
//            JYPrint("用户没有登录,不做下面操作")
            return
        }
        setupNavigationBar()
        prepareTableView()
    }
    
    private func prepareTableView() {
        // 将刷新控件添加到tableView里面
        //去掉分割线
        tableView.separatorStyle = UITableViewCellSeparatorStyle.None
        //注册cell
        tableView.registerClass(JYStatusCell.self, forCellReuseIdentifier: ReuseIdentifier)
        
        // 1.cell的高度设置为UITableViewAutomaticDimension
        tableView.rowHeight = UITableViewAutomaticDimension
        // 2.预估行高,等cell要显示的时候才回去计算真实的高度
        tableView.estimatedRowHeight = 200
        
        //上拉刷新开始
        tableView.addSubview(pullDownRefreshController)
        //3.给闭包赋值
        pullDownRefreshController.pullDownRefreshHandler = { ()->() in
            self.loadNewStatus()
        }
        // 让控件进入到刷新状态
        pullDownRefreshController.startRefreshing()
        //上拉刷新结束

    }
    //下载更多旧数据
    private func loadMoreStatus() {

        let max_id = statuses?.last?.id ?? 0
        //是可选有可能成功拿到,也有可能失败,所以先判断下
        if max_id == 0 {
        JYPrint("没有数据")
            return
        }
        JYStatusViewModel.shareInstance.loadStatus(0, max_id: max_id) { (statusModel, error) -> () in
            //停止转菊花
            self.tableView.infiniteScrollingView.stopAnimating()
            if error != nil {
                JYPrint(error)
                SVProgressHUD.showErrorWithStatus("童鞋,网络错误")
                return
            }
            
            let count = statusModel?.count ?? 0
            JYPrint("加载了\(count)条数据")
            if count == 0 {
                SVProgressHUD.showErrorWithStatus("没有更多的数据加载了///")
                if max_id == 0 {
                    JYPrint("没微博数据")
                }
                return
            }
            if max_id == 0 {
                self.statuses = statusModel
            }else{
                //注意这里一定要将老的微博数据拼接到现有数据的后面 (+ 号左右两边有顺序的)
                self.statuses = self.statuses! + statusModel!
                JYPrint("总微博数为:  \(self.statuses?.count)")
            }

        }
    }
    //下载新数据
    private func loadNewStatus() {
        // 获取ID最大的微博, 第一条微博就是ID最大的微博, 当第一次进入刷新,一条微博都没有id = 0, 加载最新20条
        let since_id = statuses?.first?.id ?? 0
        //获取微博数据 (第一个参数名不用写)
        JYStatusViewModel.shareInstance.loadStatus(since_id,max_id:0) { (statusModel, error) -> () in
            //加载数据完成了,返回pullDownRefreshController的Normal状态
            self.pullDownRefreshController.endRefreshing()
            
            if (error != nil) {
                JYPrint("获取微博数据失败了: \(error)")
                SVProgressHUD.showErrorWithStatus("加载数据失败...")
                return
            }
            // 判断返回微博的数量 (这段代码主要是为了,没有刷到强制拆包会挂)
            let count = statusModel?.count ?? 0
            JYPrint("加载了微薄数据: \(count)")
            if since_id != 0 {
                //显示刷新微博条数
                self.showTipsLabel(count)
            }
            if count == 0 {
                JYPrint("没有加载到微博数据")
                
                if since_id == 0 {
                    SVProgressHUD.showErrorWithStatus("没有加载到微博数据")
                }
                return
            }
            
            if since_id == 0 {
                self.statuses = statusModel
                //第一次来加载20条数据后,才给它加上 下拉加载更多数据这个功能
                self.tableView.addInfiniteScrollingWithActionHandler { () -> Void in
                    //上拉加载更多
                    self.loadMoreStatus()
                }
            }else{
           //注意这里一定要将新的微博数据拼接到现有数据的前面(位置在左边) (+ 号左右两边有顺序的)
            self.statuses = statusModel! + self.statuses!
            }
    
        }
    
    }

    /// 显示下拉数据提示
    /// count:更新数据的条数
    private func showTipsLabel(count: Int) {
        tipsLabel.text = count == 0 ? "没有新的微博数据" : "加载了\(count)条数据"
        if let keys = tipsLabel.layer.animationKeys() {
            JYPrint("+++++++++\( keys)")
            return
        }
        //状态栏的高度 UIApplication.sharedApplication().statusBarFrame.height
        let y = -(TipsLabelHeight + UIApplication.sharedApplication().statusBarFrame.height)
        //设置 tipsLabel 到到屏幕上面
        tipsLabel.frame = CGRectMake(0, y, UIScreen.mainScreen().bounds.width, TipsLabelHeight)
        //tableView.addSubview(tipsLabel)不合适 ; 而直接addSubView()是加到最低端
        navigationController?.navigationBar.insertSubview(tipsLabel, atIndex: 0)
        
        UIView.animateWithDuration(1, animations: { () -> Void in
            self.tipsLabel.frame = CGRectMake(0, TipsLabelHeight, UIScreen.mainScreen().bounds.width, TipsLabelHeight)
            }) { (_) -> Void in
                
                //延迟1秒
                dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
                    //延迟完后,动画回去
                    UIView.animateWithDuration(1, animations: { () -> Void in
                         self.tipsLabel.frame = CGRectMake(0, y, UIScreen.mainScreen().bounds.width, TipsLabelHeight)
                        }, completion: { (_) -> Void in
                            // 控制器一直存在一个label，动画完成不移除,只是在屏幕外面,用户看不到
                    })
                })
        }
    }
    
    //懒加载tipsLabel
    private lazy var tipsLabel: UILabel = {
        let label = UILabel(fontSize: 14, textColor: UIColor.whiteColor())
        label.textAlignment = NSTextAlignment.Center
        label.backgroundColor = UIColor.orangeColor()
        return label
    }()
    
    
    private func setupNavigationBar () {
        //左边
        navigationItem.leftBarButtonItem = UIBarButtonItem(imageName: "navigationbar_friendsearch", target: self, action: Selector("didClickPerson:"))
        
        // 右边
        navigationItem.rightBarButtonItem = UIBarButtonItem(imageName: "navigationbar_pop", target: self, action: "didClickQRCode:")
        
        //自定义题标按钮
        let name = JYUserAccountViewModel.sharaInstance.userAccount?.screen_name ?? "Johnny"
        let titleButton = JYHomeButton(title: name)
        //添加点击事件
        titleButton.addTarget(self, action: Selector("didClickTitleButton:"), forControlEvents: UIControlEvents.TouchUpInside)
        navigationItem.titleView = titleButton
        
    }
    
    //MARK: - 标题按钮点击事件
    // 根据按钮状态来做动画,当按钮 button.selected = true 时转到上面去, 当按钮 button.selected = false 时转到下面来
    // UIView动画旋转: 1.两边一样远就顺时针, 2.哪边近走哪边
    @objc private func didClickTitleButton (button: UIButton) {
        //切换妞选择状态
      button.selected = !button.selected
        //实现动画
        UIView.animateWithDuration(DefaultAnimationTime) { () -> Void in
            button.imageView?.transform =  button.selected ? CGAffineTransformMakeRotation(CGFloat(M_PI - 0.001)) : CGAffineTransformIdentity
            
        }
        
    }
    
    // MARK: - 按钮点击事件
    @objc private func didClickPerson(button: UIButton) {
        JYPrint("button: \(button)")
    }
    
    @objc private func didClickQRCode(button: UIButton) {
        JYPrint("button: \(button)")
    }
    
}


extension JYHomeTableViewController {

    override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.statuses?.count ?? 0
    }
    
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier(ReuseIdentifier, forIndexPath: indexPath) as! JYStatusCell
//        cell.textLabel?.text = self.statuses![indexPath.row].text
        cell.status = self.statuses?[indexPath.row]
        return cell
    }
    /// cell不要高亮
    override func tableView(tableView: UITableView, shouldHighlightRowAtIndexPath indexPath: NSIndexPath) -> Bool {
        return false
    }
    
    // 监听scrollView的滚动
    //    override func scrollViewDidScroll(scrollView: UIScrollView) {
    // 可以在这里监听到tableView的滚动,设置刷新控件的状态
    // 在控制器里面来设置刷新控件的状态其实不好,1.控制器需要对刷新控件非常了解才行 2.刷新控件以来控制器,到其他地方使用非常麻烦
    // 刷新控件监听tableView的滚动最好是自己来做
    //    }

}











